package com.guoxin.part4.chapter19;

/**
 * @author guoxin
 * @date 2019/8/31
 */
public class FutureTask<T> implements Future<T> {
    private T result;
    private boolean isDone;
    private final Object LOCK = new Object();

    @Override public T get() throws InterruptedException {
        synchronized (LOCK) {
            // 当任务还没完成时，调用get方法会被挂起而进入阻塞
            while (!isDone) {
                LOCK.wait();
            }
            return result;
        }
    }

    // 返回当前任务是否已经完成
    @Override public boolean done() {
        return isDone;
    }

    // finish方法主要用于为FutureTask设置计算结果
    protected void finish(T result) {
        synchronized (LOCK) {
            // blaking 设计模式
            if (isDone) {
                return;
            }
            // 计算完成，为result指定结果，并且将isDone设为true，同时唤醒阻塞中的线程
            this.result = result;
            this.isDone = true;
            LOCK.notifyAll();
        }

    }
}
